package sourceagile.server.githubFileRepository;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import com.github.api.v2.services.GitHubServiceFactory;
import com.github.api.v2.services.ObjectService;

public class GetGithubFileContent {

	public static JSONObject jsonFileContent(String username,
			String projectName, String objectSHA) {

		return jsonFileContent(getContent(username, projectName, objectSHA));
	}

	public static JSONObject jsonFileContent(String fileContent) {

		JSONObject entry = new JSONObject();

		try {

			entry.put("fileContent", fileContent);

		} catch (JSONException e) {

			e.printStackTrace();
		}

		return entry;
	}

	public static String getContent(String username, String projectName,
			String objectSHA) {

		GitHubServiceFactory factory = GitHubServiceFactory.newInstance();

		ObjectService objectService = factory.createObjectService();

		String content = convertStreamToString(objectService.getObjectContent(
				username, projectName, objectSHA));

		return content;
	}

	private static String convertStreamToString(InputStream is) {
		/*
		 * To convert the InputStream to String we use the
		 * BufferedReader.readLine() method. We iterate until the BufferedReader
		 * return null which means there's no more data to read. Each line will
		 * appended to a StringBuilder and returned as String.
		 */
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuilder sb = new StringBuilder();

		String line = null;
		try {
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return sb.toString();
	}

}
